어핀 변환
어핀 변환 (Affine Transformation)
어핀 변환은 선형 변환(Linear Transformation)과 평행 이동(Translation)이 결합된 기하학적 변환으로, 변환 후에도 직선의 직선성과 평행선 간의 평행성이 유지되는 특성을 가진 함수이다.
1. 개요
어핀 변환은 유클리드 공간에서 점들의 위치를 변경하는 변환의 일종이다. 핵심은 '선형 변환(회전, 크기 조절, 전단) + 평행 이동'의 구조를 가진다는 점이다. 일반적인 선형 변환은 원점을 고정시키지만, 어핀 변환은 평행 이동 성분을 포함함으로써 원점을 다른 위치로 옮길 수 있어 이미지 처리 및 컴퓨터 그래픽스에서 객체의 위치와 형태를 자유롭게 조절하는 데 필수적으로 사용된다.
2. 수학적 원리
2.1 기본 수식
2차원 공간의 점 $\mathbf{x} = [x, y]^T$를 $\mathbf{x'} = [x', y']^T$로 변환하는 어핀 변환은 다음과 같은 행렬식으로 표현된다.
$$\mathbf{x'} = \mathbf{A}\mathbf{x} + \mathbf{b}$$
여기서 $\mathbf{A}$는 $2 \times 2$ 선형 변환 행렬(Linear Transformation Matrix)이며, $\mathbf{b}$는 평행 이동 벡터(Translation Vector)이다.
2.2 동차 좌표계 (Homogeneous Coordinates)
위의 수식은 행렬 곱과 벡터 합이 혼재되어 있어 연산 효율이 떨어진다. 이를 해결하기 위해 좌표계에 차원을 하나 추가하는 동차 좌표계를 도입한다. 2D 좌표 $(x, y)$를 $(x, y, 1)$로 표현하면, 변환 과정 전체를 하나의 행렬 곱으로 통합할 수 있다.
$$\begin{bmatrix} x' \\ y' \\ 1 \end{bmatrix} = \begin{bmatrix} a_{11} & a_{12} & t_x \\ a_{21} & a_{22} & t_y \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix}$$
2.3 2D와 3D 변환 행렬 비교
차원이 증가함에 따라 행렬의 크기는 커지지만, 기본 구조(선형 변환부 + 이동부)는 동일하게 유지된다.
| 구분 | 입력 좌표 | 변환 행렬 크기 | 행렬 구조 특징 |
|---|---|---|---|
| 2D 어핀 변환 | $(x, y, 1)$ | $3 \times 3$ | 상단 $2 \times 2$ (선형), 우측 $2 \times 1$ (이동) |
| 3D 어핀 변환 | $(x, y, z, 1)$ | $4 \times 4$ | 상단 $3 \times 3$ (선형), 우측 $3 \times 1$ (이동) |
3. 주요 변환 종류
3.1 변환별 특성 및 행렬
- 이동 (Translation): 모든 점을 일정한 거리와 방향으로 옮긴다.
- 행렬: $\begin{bmatrix} 1 & 0 & t_x \\ 0 & 1 & t_y \\ 0 & 0 & 1 \end{bmatrix}$
- 크기 조절 (Scaling): 원점을 기준으로 좌표를 확대 또는 축소한다.
- 행렬: $\begin{bmatrix} s_x & 0 & 0 \\ 0 & s_y & 0 \\ 0 & 0 & 1 \end{bmatrix}$
- 참고: 실제 이미지 처리에서 이미지 중심을 기준으로 스케일링하려면
이동(중심을 원점으로) $\rightarrow$ 스케일링 $\rightarrow$ 역이동(원점을 다시 중심으로)과정이 필요하다. - 회전 (Rotation): 원점을 중심으로 특정 각도 $\theta$만큼 회전시킨다.
- 행렬: $\begin{bmatrix} \cos\theta & -\sin\theta & 0 \\ \sin\theta & \cos\theta & 0 \\ 0 & 0 & 1 \end{bmatrix}$
- 전단 (Shearing): 한 축을 고정하고 다른 축 방향으로 밀어내어 평행사변형 형태로 변형한다.
- 행렬(x축 전단): $\begin{bmatrix} 1 & k & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix}$
4. 어핀 변환의 성질
4.1 기하학적 불변성
어핀 변환을 거친 후에도 다음과 같은 성질은 변하지 않는다. - 직선성 (Collinearity): 변환 전 직선 위에 있던 점들은 변환 후에도 여전히 직선 위에 존재한다. - 평행성 (Parallelism): 변환 전 서로 평행했던 두 직선은 변환 후에도 평행을 유지한다. - 비율 (Ratio of Lengths): 한 직선 위에 있는 세 점의 거리 비율은 유지된다.
4.2 투영 변환(Projective Transformation)과의 차이
어핀 변환은 투영 변환의 특수한 사례이다. 가장 큰 차이점은 '평행성의 유지 여부'이다. 투영 변환(호모그래피)은 원근감을 표현하므로 평행했던 선들이 소실점으로 모이게 되어 평행성이 파괴되지만, 어핀 변환은 이를 유지한다.
4.3 변환별 시각적 특성 비교
| 변환 종류 | 원본 형태 | 변환 후 형태 | 유지되는 성질 | 비고 |
|---|---|---|---|---|
| 이동 | 정사각형 | 정사각형 | 모양, 크기, 각도 | 위치만 변경 |
| 크기 조절 | 정사각형 | 직사각형 | 각도, 평행성 | 비율에 따라 형태 변화 |
| 회전 | 정사각형 | 회전된 정사각형 | 모양, 크기, 각도 | 원점 기준 방향 변경 |
| 전단 | 정사각형 | 평행사변형 | 평행성 | 각도 및 길이 변화 |
5. 역행렬을 이용한 역변환 (Inverse Transformation)
어핀 변환 행렬 $\mathbf{M}$이 가역 행렬(Invertible Matrix)인 경우, 변환된 좌표 $\mathbf{x'}$를 다시 원래의 좌표 $\mathbf{x}$로 되돌릴 수 있다.
$$\mathbf{x} = \mathbf{M}^{-1} \mathbf{x'}$$
역변환은 이미지 워핑(Warping) 과정에서 매우 중요하다. 출력 이미지의 각 픽셀이 입력 이미지의 어느 좌표에서 왔는지 계산하는 역방향 매핑(Backward Mapping) 방식에서 역행렬이 사용되며, 이를 통해 출력 이미지에 빈 픽셀(Hole)이 생기는 것을 방지한다.
6. 변환 행렬의 합성 (Composition)
여러 단계의 변환(예: 회전 후 이동)을 적용해야 할 때, 각 단계의 변환 행렬을 순차적으로 곱하여 하나의 통합된 변환 행렬을 만들 수 있다. 이를 행렬 합성이라고 한다.
만약 첫 번째 변환 행렬이 $\mathbf{M}_1$이고 두 번째 변환 행렬이 $\mathbf{M}_2$라면, 최종 변환 결과는 다음과 같다. $$\mathbf{x'} = \mathbf{M}_2 (\mathbf{M}_1 \mathbf{x}) = (\mathbf{M}_2 \mathbf{M}_1) \mathbf{x} = \mathbf{M}_{total} \mathbf{x}$$
주의: 행렬 곱셈은 교환법칙이 성립하지 않으므로, 변환의 순서($\mathbf{M}_1 \rightarrow \mathbf{M}_2$)가 결과에 결정적인 영향을 미친다.
7. 활용 분야 및 응용
- 이미지 정렬 (Image Alignment): 서로 다른 각도나 위치에서 촬영된 두 이미지를 하나의 기준 좌표계로 맞추는 작업.
- 데이터 증강 (Data Augmentation): 딥러닝 학습 시, 기존 이미지에 무작위 회전, 이동, 전단을 적용하여 데이터셋의 양을 늘리고 모델의 일반화 성능을 높임.
- 컴퓨터 그래픽스: 3D 모델의 객체를 배치하거나, 2D UI 요소의 크기와 위치를 조정할 때 사용.
- OCR (광학 문자 인식): 기울어진 문서 이미지를 수평으로 바로잡는 'Deskewing' 과정에 활용.
8. 구현 및 실습
8.1 행렬 생성 예시 (OpenCV)
import cv2
import numpy as np
# 이미지 크기 정의
rows, cols = 512, 512
# 1. 이동 행렬 (x+100, y+50)
M_trans = np.float32([[1, 0, 100], [0, 1, 50]])
# 2. 회전 행렬 (중심점(256,256), 각도 45도, 배율 1.0)
M_rot = cv2.getRotationMatrix2D((cols/2, rows/2), 45, 1)
# 3. 크기 조절 행렬 (x 1.5배, y 0.7배)
M_scale = np.float32([[1.5, 0, 0], [0, 0.7, 0]])
8.2 대응점을 이용한 변환 및 이미지 워핑
어핀 변환은 3개의 대응점(Control Points)만 알면 변환 행렬 $\mathbf{M}$을 유일하게 결정할 수 있다.
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('input.jpg')
rows, cols = img.shape[:2] # 이미지 크기 정의
# 1. 대응점 정의 (입력 이미지 3점 -> 출력 이미지 3점)
pts1 = np.float32([[50, 50], [200, 50], [50, 200]])
pts2 = np.float32([[10, 100], [200, 150], [100, 300]])
# 2. 대응점을 이용해 어핀 변환 행렬 계산
M = cv2.getAffineTransform(pts1, pts2)
# 3. 이미지 워핑 적용
# warpAffine(src, M, dsize)
dst = cv2.warpAffine(img, M, (cols, rows))
plt.imshow(cv2.cvtColor(dst, cv2.COLOR_BGR2RGB))
plt.show()
분류: 기술 / 이미지 처리 / 기하 변환
이 문서는 AI 모델(gemma-4-31b)에 의해 생성된 콘텐츠입니다.
주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.